﻿2026-05-10T11:51:13.1486688Z ##[group]Run pnpm verify:phase-4
2026-05-10T11:51:13.1486982Z [36;1mpnpm verify:phase-4[0m
2026-05-10T11:51:13.1500188Z shell: /usr/bin/bash -e {0}
2026-05-10T11:51:13.1500426Z env:
2026-05-10T11:51:13.1500666Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T11:51:13.1500965Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T11:51:13.1501179Z   SKIP_TRACE_CHECK: 1
2026-05-10T11:51:13.1502119Z ##[endgroup]
2026-05-10T11:51:13.4315603Z 
2026-05-10T11:51:13.4316726Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T11:51:13.4317665Z > node scripts/verify-phase-4.mjs
2026-05-10T11:51:13.4318105Z 
2026-05-10T11:51:13.4606765Z 
2026-05-10T11:51:13.4607592Z === Workspace: typecheck ===
2026-05-10T11:51:13.4608287Z >>> pnpm -r typecheck
2026-05-10T11:51:13.7528139Z Scope: 5 of 6 workspace projects
2026-05-10T11:51:13.7576474Z packages/db typecheck$ tsc --noEmit
2026-05-10T11:51:13.7584502Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T11:51:16.1692596Z packages/game-logic typecheck: Done
2026-05-10T11:51:16.1762663Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T11:51:18.0873134Z packages/db typecheck: Done
2026-05-10T11:51:19.3457982Z packages/protocol typecheck: Done
2026-05-10T11:51:19.3464049Z apps/client typecheck$ tsc --noEmit
2026-05-10T11:51:19.3480570Z apps/server typecheck$ tsc --noEmit
2026-05-10T11:51:29.9392916Z apps/client typecheck: Done
2026-05-10T11:51:30.8153905Z apps/server typecheck: Done
2026-05-10T11:51:30.8222288Z 
2026-05-10T11:51:30.8223103Z === Lint: protocol-sync ===
2026-05-10T11:51:30.8223798Z >>> pnpm lint:protocol-sync
2026-05-10T11:51:31.1030264Z 
2026-05-10T11:51:31.1031289Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T11:51:31.1032592Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T11:51:31.1033161Z 
2026-05-10T11:51:31.1331438Z lint-protocol-sync: OK
2026-05-10T11:51:31.1422197Z 
2026-05-10T11:51:31.1423071Z === Lint: game-logic-purity ===
2026-05-10T11:51:31.1423990Z >>> pnpm lint:game-logic-purity
2026-05-10T11:51:31.4246727Z 
2026-05-10T11:51:31.4247777Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T11:51:31.4248865Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T11:51:31.4249401Z 
2026-05-10T11:51:31.4547240Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T11:51:31.4636258Z 
2026-05-10T11:51:31.4637126Z === Lint: better-auth-schema-sync ===
2026-05-10T11:51:31.4638129Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T11:51:31.7413965Z 
2026-05-10T11:51:31.7414970Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T11:51:31.7416056Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T11:51:31.7416701Z 
2026-05-10T11:51:33.1985733Z lint-better-auth-schema-sync: OK
2026-05-10T11:51:33.2077165Z 
2026-05-10T11:51:33.2077997Z === Lint: rate-limit-budgets ===
2026-05-10T11:51:33.2078834Z >>> pnpm lint:rate-limit-budgets
2026-05-10T11:51:33.4882419Z 
2026-05-10T11:51:33.4883543Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T11:51:33.4884617Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T11:51:33.4885198Z 
2026-05-10T11:51:33.5173323Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T11:51:33.5272111Z 
2026-05-10T11:51:33.5273576Z === Lint: no-clipboard-rce ===
2026-05-10T11:51:33.5274146Z >>> pnpm lint:no-clipboard-rce
2026-05-10T11:51:33.8089035Z 
2026-05-10T11:51:33.8090091Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T11:51:33.8091282Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T11:51:33.8092009Z 
2026-05-10T11:51:33.8398583Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T11:51:33.8492457Z 
2026-05-10T11:51:33.8493241Z === Lint: room-layout ===
2026-05-10T11:51:33.8493831Z >>> pnpm lint:room-layout
2026-05-10T11:51:34.1330864Z 
2026-05-10T11:51:34.1331958Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T11:51:34.1332791Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T11:51:34.1333769Z 
2026-05-10T11:51:34.1656106Z lint-room-layout: OK
2026-05-10T11:51:34.1741063Z 
2026-05-10T11:51:34.1743537Z === ADR 0004 lint ===
2026-05-10T11:51:34.1744129Z >>> pnpm lint:adr:0004
2026-05-10T11:51:34.4557788Z 
2026-05-10T11:51:34.4558691Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T11:51:34.4559821Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T11:51:34.4560980Z 
2026-05-10T11:51:34.4857324Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T11:51:34.4942949Z 
2026-05-10T11:51:34.4943479Z === Drizzle: emit-check ===
2026-05-10T11:51:34.4944063Z >>> pnpm db:emit-check
2026-05-10T11:51:34.7741830Z 
2026-05-10T11:51:34.7742762Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T11:51:34.7745263Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T11:51:34.7747077Z 
2026-05-10T11:51:35.1892939Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T11:51:35.1895644Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T11:51:35.5924618Z 8 tables
2026-05-10T11:51:35.5925331Z accounts 8 columns 1 indexes 0 fks
2026-05-10T11:51:35.5926106Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T11:51:35.5926823Z characters 9 columns 0 indexes 1 fks
2026-05-10T11:51:35.5927517Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T11:51:35.5928266Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T11:51:35.5929112Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T11:51:35.5929846Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T11:51:35.5930524Z sessions 5 columns 0 indexes 1 fks
2026-05-10T11:51:35.5930960Z 
2026-05-10T11:51:35.5931874Z No schema changes, nothing to migrate 😴
2026-05-10T11:51:36.0786003Z 
2026-05-10T11:51:36.0786793Z === Drizzle: schema-sync ===
2026-05-10T11:51:36.0787534Z >>> pnpm lint:schema-sync
2026-05-10T11:51:36.3605833Z 
2026-05-10T11:51:36.3606834Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T11:51:36.3610141Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T11:51:36.3612732Z 
2026-05-10T11:51:36.3869232Z OK
2026-05-10T11:51:36.3957885Z 
2026-05-10T11:51:36.3958648Z === Drizzle: source-comments ===
2026-05-10T11:51:36.3959408Z >>> pnpm lint:source-comments
2026-05-10T11:51:36.6775271Z 
2026-05-10T11:51:36.6776016Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T11:51:36.6776520Z > pnpm -C packages/db run lint:source-comments
2026-05-10T11:51:36.6776718Z 
2026-05-10T11:51:36.9587393Z 
2026-05-10T11:51:36.9588602Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T11:51:36.9589707Z > node scripts/check-source-comments.mjs
2026-05-10T11:51:36.9590206Z 
2026-05-10T11:51:36.9883107Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T11:51:37.0042141Z 
2026-05-10T11:51:37.0042810Z === Workspace: test ===
2026-05-10T11:51:37.0043396Z >>> pnpm -r test
2026-05-10T11:51:37.2952493Z Scope: 5 of 6 workspace projects
2026-05-10T11:51:37.3001693Z packages/db test$ vitest run
2026-05-10T11:51:37.3009444Z packages/game-logic test$ vitest run
2026-05-10T11:51:37.7783889Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T11:51:37.8311404Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T11:51:38.1875082Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T11:51:38.4463946Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T11:51:38.6825230Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:51:38.7841315Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:51:38.9164118Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:51:38.9222834Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T11:51:38.9249666Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T11:51:38.9252488Z packages/game-logic test: [2m   Start at [22m 11:51:37
2026-05-10T11:51:38.9277912Z packages/game-logic test: [2m   Duration [22m 1.08s[2m (transform 128ms, setup 0ms, import 233ms, tests 45ms, environment 1ms)[22m
2026-05-10T11:51:38.9630034Z packages/game-logic test: Done
2026-05-10T11:51:38.9644264Z packages/protocol test$ vitest run
2026-05-10T11:51:38.9923872Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:51:39.4098663Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T11:51:39.8187317Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-10T11:51:39.8370204Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T11:51:39.8433094Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T11:51:39.8454026Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T11:51:39.8461881Z packages/db test: [2m   Start at [22m 11:51:37
2026-05-10T11:51:39.8465684Z packages/db test: [2m   Duration [22m 2.05s[2m (transform 140ms, setup 0ms, import 1.48s, tests 26ms, environment 0ms)[22m
2026-05-10T11:51:39.8637883Z packages/db test: Done
2026-05-10T11:51:39.9849298Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T11:51:40.1384554Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:51:40.2952447Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:51:40.2983222Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T11:51:40.2984861Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T11:51:40.2985984Z packages/protocol test: [2m   Start at [22m 11:51:39
2026-05-10T11:51:40.2987524Z packages/protocol test: [2m   Duration [22m 879ms[2m (transform 143ms, setup 0ms, import 261ms, tests 35ms, environment 0ms)[22m
2026-05-10T11:51:40.3305495Z packages/protocol test: Done
2026-05-10T11:51:40.3311705Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T11:51:40.3322540Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T11:51:40.8133473Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T11:51:40.9213645Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T11:51:42.0196521Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 118[2mms[22m[39m
2026-05-10T11:51:42.2837043Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T11:51:42.3513801Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T11:51:42.3529611Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T11:51:42.3635280Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 163[2mms[22m[39m
2026-05-10T11:51:42.5528544Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T11:51:42.8213471Z apps/server test: {"level":40,"time":1778413902816,"pid":3240,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:51:42.8253289Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T11:51:42.8312981Z apps/server test: {"level":40,"time":1778413902820,"pid":3240,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:51:42.8353207Z apps/server test: {"level":40,"time":1778413902821,"pid":3240,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:51:43.4909375Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T11:51:43.6615156Z apps/server test: {"level":30,"time":1778413903659,"pid":3251,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T11:51:43.6645178Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 628[2mms[22m[39m
2026-05-10T11:51:43.6676121Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 498[2mms[22m[39m
2026-05-10T11:51:44.6305031Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T11:51:44.6457020Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T11:51:44.6488929Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-sg6E3j/rebno.db
2026-05-10T11:51:44.6490764Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:51:44.6491933Z apps/server test: [run-migrations] OK
2026-05-10T11:51:44.6710530Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T11:51:44.6723228Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Aehv7B/rebno.db
2026-05-10T11:51:44.6729207Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:51:44.6737793Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T11:51:44.6739400Z apps/server test: [run-migrations] OK
2026-05-10T11:51:44.6803739Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T11:51:44.6822908Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-LpYHT9/rebno.db
2026-05-10T11:51:44.6830717Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:51:44.6832015Z apps/server test: [run-migrations] OK
2026-05-10T11:51:44.6835633Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T11:51:44.6838200Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-LpYHT9/rebno.db
2026-05-10T11:51:44.6839787Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:51:44.6841998Z apps/server test: [run-migrations] OK
2026-05-10T11:51:44.6896350Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 61[2mms[22m[39m
2026-05-10T11:51:44.9616955Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T11:51:45.1705902Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:51:45.4563588Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 27[2mms[22m[39m
2026-05-10T11:51:45.6645757Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:51:45.7273588Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 95[2mms[22m[39m
2026-05-10T11:51:46.4456531Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T11:51:46.4473373Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ custom filepath { path: '/custom/path/.env' }
2026-05-10T11:51:46.4484287Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T11:51:46.9224614Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 131[2mms[22m[39m
2026-05-10T11:51:47.1499287Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:51:47.1613580Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T11:51:47.1617370Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T11:51:47.1618561Z apps/server test: [2m   Start at [22m 11:51:40
2026-05-10T11:51:47.1619988Z apps/server test: [2m   Duration [22m 6.34s[2m (transform 407ms, setup 0ms, import 3.26s, tests 920ms, environment 2ms)[22m
2026-05-10T11:51:47.1962817Z apps/server test: Done
2026-05-10T11:51:47.6218489Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T11:51:48.2823664Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 70[2mms[22m[39m
2026-05-10T11:51:48.8868537Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:51:49.5075744Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:51:50.1161014Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:51:50.7204429Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T11:51:51.3164926Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:51:51.9150629Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T11:51:52.5078771Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:51:53.0825290Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:51:53.6841155Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:51:53.7013463Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T11:51:53.7036111Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T11:51:53.7037478Z apps/client test: [2m   Start at [22m 11:51:40
2026-05-10T11:51:53.7039307Z apps/client test: [2m   Duration [22m 12.78s[2m (transform 523ms, setup 46ms, collect 802ms, tests 567ms, environment 7.26s, prepare 1.50s)[22m
2026-05-10T11:51:53.8272344Z apps/client test: Done
2026-05-10T11:51:53.8330486Z 
2026-05-10T11:51:53.8331417Z verify-phase-4: OK (12 steps green)
